"""
本例中，有一些时间段数据，
需要将这些时间段里的时间以小时为分组，
将24个小时段中每个小时所占用的秒数计算出来
"""
"""数据集，包含了开始时间和结束时间
start_time,end_time
2/2/2021 07:24:15,2/2/2021 08:54:41
2/3/2021 11:00:05,2/3/2021 15:10:37
2/1/2021 10:40:34,2/1/2021 14:43:50
2/4/2021 10:37:37,2/4/2021 11:19:17
2/3/2021 20:37:51,2/4/2021 02:37:52
2/3/2021 21:37:52,2/3/2021 22:08:39

以第一条数据为例，它所在两个小时，7点段占用24分钟15秒，8点段54分钟41秒。
其他数据同理进行解析计算，最后按小时段合并，最终计算出各个小时段的用时。
"""
"""
思路
处理思路和流程如下（可对照代码阅读）：

用 pd.read_clipboard 读取数据 df，并将列解析为时间类型
编写一个函数用于将时段解析为不同小时的秒数：
用 pd.period_range 将开始时间和结束时间构建一个周期对象，单位为秒
对周期数据用秒做 groupby 分组
用分组的 items 方法取出 key 和 value，key 是小时，value 时长
用字典推导式将各个小时拼为一个字典，key 是小时，value 取秒
df 按行调用上边的函数，每行数据会自成一个上述函数组成的字典
最后将所有字典按 key 合并，相加得到总的秒数，最终得到结果
还可以对其进行可视化分析
"""
import pandas as pd
import matplotlib.pyplot as plt

# 读取剪贴板，用逗号分隔，解析两个字段为时间类型
df = pd.read_clipboard(sep=",", parse_dates=[0, 1])
# 查看类型
print(df.dtypes)


# 将开始时间和结束时间解析为每个小时的时长(秒)
def duration_by_hour(start, end):
    p = pd.period_range(pd.Period(start, freq="s"), pd.Period(end, freq="s"))
    pr = {h: pd.to_timedelta(t[-1] - t[0]).seconds for h, t in p.groupby(p.hour).items()}
    return pr


# 将每行数据应用函数，解析出每个小时对应的秒数
s = df.apply(lambda r: duration_by_hour(r["start_time"], r["end_time"]), axis=1)
print(s)

# 按小时合并秒数
final = {}
for d in s.tolist():
    for k in d.keys():
        final[k] = final.get(k, 0) + d[k]

print(final)

# 可视化，单位转换为分钟
sr = pd.Series(final).sort_index() / 60
print(sr)
sr.plot.bar()
plt.show()
